Shell 脚本实现串口操作

您所在的位置:网站首页 linux 连接串口指令 Shell 脚本实现串口操作

Shell 脚本实现串口操作

2024-07-17 00:39| 来源: 网络整理| 查看: 265

前言

命令行下常用的串口连接工具有 screen、minicom等。

实际生产测试需求中,常常有串口连通性测试,其对应的最简单的测试方法即:「调用非交互式串口工具登录串口并发送(命令)接收数据(命令返回)」。

这种情况下,screen、minicom需交互模式下使用的工具已不适用(不易使用expect实现,而且需要额外安装工具)。

根据测试方法可以知道,实际测试工具所需具备功能并不复杂,所以通常我们使用 c语言 或 python 调用相关库完成该工具的编写。

但秉承能偷懒就偷懒,能用shell本身实现绝对不多**的宗旨,此文探索下 shell 的实现方法。

Shell实现

主要的实现思路:stty实现串口波特率等的设置,cat实现内容的读取,echo实现串口输入。

实现效果普通非交互式命令与普通终端操作无区别,如ls,cd等在使用交互式命令时,不太友好,但可以实现一些简单操作,如vim中的上下翻页等可拓展性好,可将串口登录退出等操作嵌入脚本中,调用该脚本工具时只用关注命令发送和返回内容解析即可stty修改串口终端设置

初始状态时,使用cat /dev/ttyUSB0可能会出现刷屏或者乱码,需使用stty进行相关参数设置。通常使用的命令为stty -F /dev/serial_port raw port_speed。在该命令之后就可以使用echo/cat进行输入输出操作了。

但是在有些时候依旧有乱码出现,这时候需要一些额外的参数设置。由于相关参数设置较多,不能保证设置完后达到预期效果,所以需要一个比较取巧的办法:「使用screen或者minicom等初始化设置串口之后的设置」。具体操作如下:

首先使用stty获取当前串口默认值,从第一行开始分别是串口波特率Special charactersSpecial settingsControl settingsInput settingsOutput settingsLocal settings代码语言:javascript复制[root@localhost ~]# stty -a -F /dev/ttyUSB0 speed 9600 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke 使用screen /dev/ttyUSB0 115200(或者使用minicom)登入串口,确认可以正常读写后退出再使用stty获取当前设置,主要查看第一步中 4-7 行代码语言:javascript复制[root@localhost ~]# stty -a -F /dev/ttyUSB0 speed 115200 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = ; eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2; -parenb -parodd -cmspar cs8 -hupcl -cstopb cread clocal -crtscts -ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke 比较两者可发现有些设置的不同,直接将4-7行带入stty命令,即可完成对串口终端的正确设置,前面的1-3行内容也可视情况导入,需根据帮助文档做参数格式改动。另,若只为设置串口,不需要human-readable,可使用stty-readable模式进行设置的导出和导入:代码语言:javascript复制[root@localhost ~]# stty -g -F /dev/ttyUSB0 500:5:cbd:8a3b:3:1c:7f:15:4:0:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 [root@localhost ~]# stty -F /dev/ttyUSB0 "406:0:18b2:8a30:3:1c:7f:8:4:2:64:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0" stty: /dev/ttyUSB0: unable to perform all requested operations [root@localhost ~]# stty -a -F /dev/ttyUSB0 speed 115200 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = ; eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2; -parenb -parodd -cmspar cs8 -hupcl -cstopb cread clocal -crtscts -ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke 脚本实现代码语言:javascript复制[root@localhost ~]# cat /opt/connect_serial.sh #!/bin/bash function usage() { cat Example: $0 /dev/ttyS0 115200 ! exit 255 } function clean() { # Terminate background read process kill $bgPid echo exit 0 } # "Ctrl c" to exit trap clean SIGINT [ $# -ne 2 ] && usage device_name=$1 port_speed=$2 # Set up device stty -F $device_name $port_speed min 100 time 2 brkint ignpar \ -parenb -parodd -cmspar cs8 -hupcl -cstopb cread clocal -crtscts \ -ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff \ -iuclc -ixany -imaxbel -iutf8 \ -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 \ -isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt \ echoctl echoke # Let cat read the device $device_name in the background cat $device_name & # Capture PID of background process so it is possible to terminate it when done bgPid=$! # Read commands from user, send them to device $device_name echo > $device_name while read cmd do echo "$cmd" > $device_name [ "$cmd" == "exit" -o "$cmd" == "quit" ] && clean done 实际使用

此处只做交互式演示,若需要做非交互式测试等其他需求,可自行修改输入输出逻辑,或使用expect实现

代码语言:javascript复制[root@localhost ~]# /opt/connect_serial.sh /dev/ttyUSB0 115200 000 login: UUT000000000000 login: admin admin Password: 123456 (audit 139) Sat Jan-01 2000-16:45:08 : [SERIAL] Login from IP:127.0.0.1 user:admin (strlen:70) [2866 : 2866 INFO]SERIAL Login from IP:127.0.0.1 user:admin old_active_active_session:0 current_active_sessions:1 ~ # ls ls ~ # pwd pwd /root ~ # exit [root@localhost ~]#


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3